Packages
Case studies
Load data
per lemma
Comparative analyses
Filtering
- specific lemmas
- data after 2018-12-31
- frequency threshhold
- edges threshhold
Usage intensity
uses <- get_uses(tweets)
uses_tot <- get_uses_tot(uses)
age = get_age(uses)
coef_var <- get_coef_var(uses)
mean_date <- get_mean_date(uses)
max_date <- get_max_date(uses)
uses_month <- conv_uses_month(uses)
uses_plt <- plt_uses(uses_month, lemma, mean_date, max_date)
ggplotly(uses_plt)
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
Degree centralization
Diachronic
plt <- df_comp %>%
filter(
SUBSET != 'full',
# LEMMA == 'solopreneur'
LEMMA %in% c(
'ghosting',
'lituation',
'alt-left',
'solopreneur'
)
) %>%
select(LEMMA, SUBSET, CENT_DEGREE) %>%
mutate(SUBSET = factor(SUBSET, levels=c('first', 'mean', 'max', 'last'))) %>%
ggplot(., aes(x=SUBSET, y=CENT_DEGREE)) + # group=1
geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
guides(group=FALSE) +
ggtitle('Diffusion over time: changes in degree centralization') +
scale_y_continuous('degree centrality (log)', trans='log') +
scale_x_discrete('subset')
plt

# ggsave('out/cent_deg_diac_Anglo-Saxon.pdf', width=6, height=4)
Comparative analyses
Degree centrality
Overall
List
df_comp %>%
select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
filter(
SUBSET == 'full',
# USES >= 10000
) %>%
arrange((CENT_DEGREE))
Plot
plt <- df_comp %>%
select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
filter(SUBSET == 'full') %>%
arrange((CENT_DEGREE)) %>%
ggplot(., aes(x=CENT_DEGREE, y=reorder(LEMMA, CENT_DEGREE))) +
geom_point() +
scale_y_discrete('lemmas') +
scale_x_continuous(
'degree centralization (log)',
trans='log'
)
plt
ggsave('out/cent_sync_all.pdf', width=6, height=4)

Over time
Across all lemmas
df_comp %>%
filter(
SUBSET %in% (c(
'first',
'last'
# 'mean',
# 'max'
)),
EDGES >= 700
) %>%
group_by(SUBSET) %>%
summarize(CENT_AVG = mean(CENT_DEGREE)) %>%
mutate(SUBSET = factor(SUBSET, levels=c(
'first',
'last'
# 'mean',
# 'max'
))) %>%
ggplot(., aes(x=SUBSET, y=CENT_AVG, group=1)) +
geom_col()

Biggest changes
df_comp %>%
select(LEMMA, SUBSET, CENT_DEGREE, EDGES) %>%
filter(
SUBSET %in% c('first', 'last'),
EDGES >= 100
) %>%
dplyr::group_by(LEMMA) %>%
dplyr::mutate(CENT_DIFF = lag(CENT_DEGREE) - CENT_DEGREE) %>%
drop_na() %>%
select(-SUBSET) %>%
rename(
CENT_LAST = CENT_DEGREE,
EDGES_LAST = EDGES
) %>%
arrange(desc(CENT_DIFF))
Usage intensity vs. network characteristics
Uses vs. degree centralization
Plot
df_comp %>%
filter(
SUBSET == 'full',
# USES %in% (10000:2000000),
USES %in% (150000:500000),
!LEMMA %in% c('slut shaming', 'dashcam', 'shareable', 'cuckold', 'deep learning', 'hyperlocal')
) %>%
select(LEMMA, CENT_DEGREE, USES, EDGES) %>%
ggplot(., aes(x=CENT_DEGREE, y=USES)) +
geom_text(aes(label=LEMMA), hjust=-0.1, vjust=-0.1) +
geom_point() +
scale_y_continuous(
'usage frequency (log)',
trans='log'
) +
scale_x_continuous(
'degree centralization',
# trans='log'
) +
ggtitle(
# 'Usage frequency vs. degree centralization: full sample'
'Usage frequency vs. degree centralization: zooming on case study lexemes'
)
# geom_smooth(method=lm)
ggsave('~/Desktop/freq-vs-net.pdf', width=6, height=4)

NA
Correlation
df_corr_full <- df_comp %>%
filter(
SUBSET != 'full',
EDGES >= 100
) %>%
select(-c(LEMMA, SUBSET, NET_WINDOW_DATES, SKIP, STAMP, NROWS))
cor.test(df_corr_full$USES, df_corr_full$CENT_DEGREE)
Degree centrality vs. communities
Correlation
df_comp %>%
filter(SUBSET == 'last') %>%
select(CENT_DEGREE, COMMUNITIES) %>%
mutate(COMMUNITIES = as.numeric(COMMUNITIES)) %>%
correlate()
Plot
df_comp %>%
filter(SUBSET == 'last') %>%
select(LEMMA, CENT_DEGREE, COMMUNITIES) %>%
ggplot(., aes(x=CENT_DEGREE, y=as.numeric(COMMUNITIES))) +
geom_text(aes(label=LEMMA)) +
scale_x_continuous(trans='log')
Uses vs. users
Plot
plt <- df_comp %>%
filter(SUBSET == 'full') %>%
select(LEMMA, USES, USERS) %>%
ggplot(., aes(x=USERS, y=USES)) +
geom_text(aes(label=LEMMA)) +
scale_x_continuous(trans='log') +
scale_y_continuous(trans='log') +
geom_smooth(method=lm)
ggplotly(plt)
Correlation
df_comp %>%
filter(SUBSET == 'full') %>%
select(USES, USERS) %>%
correlate()
Coefficient of variation
df_comp %>%
filter(
SUBSET == 'full',
USES >= 1000
) %>%
select(LEMMA, USES, COEF_VAR) %>%
arrange(desc(COEF_VAR))
Processing status
Lemma list
df_comp %>%
select(LEMMA, SUBSET, STAMP) %>%
filter(SUBSET == 'last') %>%
mutate(STAMP = as_datetime(STAMP)) %>%
arrange(desc(STAMP))
COEF_VAR vs. CENT
df_comp %>%
filter(SUBSET == 'full') %>%
select(LEMMA, COEF_VAR, CENT_DEGREE) %>%
ggplot(., aes(y=COEF_VAR, x=CENT_DEGREE)) +
geom_text(aes(label=LEMMA)) +
scale_y_continuous(trans='log')
Correlations: EDA
library(Hmisc)
df_corr <- df_comp %>%
# filter(SUBSET == 'last') %>%
select(-c(LEMMA, SUBSET, NET_WINDOW_DATES, SKIP, STAMP, NROWS))
# select(-c(USERS, AGE)) %>%
# mutate(FOCUS = USES) %>%
# focus(FOCUS) %>%
# ggplot(., aes(reorder(rowname, FOCUS), FOCUS)) +
# geom_col() +
# coord_flip()
# rearrange() %>%
# shave() %>%
# rplot()
# network_plot(min_cor=.5) %>%
LS0tCmF1dGhvcjogJ1F1aXJpbiBXw7xyc2NoaW5nZXInCnRpdGxlOiAiU29jaWFsIG5ldHdvcmtzIG9mIGxleGljYWwgaW5ub3ZhdGlvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKIyBQYWNrYWdlcwoKYGBge3IgaW5jbHVkZT1GQUxTRX0Kc291cmNlKCdzcmMvbG9hZC1kYXRhLlInKQpzb3VyY2UoJ3NyYy9wb3N0cHJvYy5SJykKc291cmNlKCdzcmMvdXNlcy5SJykKc291cmNlKCdzcmMvdXNlcnMuUicpCnNvdXJjZSgnc3JjL3NuYS5SJykKCmxpYnJhcnkoY29ycnIpCmxpYnJhcnkodGlkeXIpCmBgYAoKIyBDYXNlIHN0dWRpZXMKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmNhc2VzIDwtIGMoJ2dob3N0aW5nJywgJ2xpdHVhdGlvbicsICdhbHQtbGVmdCcsICdzb2xvcHJlbmV1cicpCmBgYAoKIyMgTG9hZCBkYXRhCgojIyMgcGVyIGxlbW1hCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpjb3JwdXMgPC0gJy9Wb2x1bWVzL3FqZC90d2ludC8nCmxlbW1hIDwtICdBbmdsby1TYXhvbicKCnR3ZWV0cyA8LSBsb2FkX2RhdGEoY29ycHVzLCBsZW1tYSkKdHdlZXRzIDwtIHBvc3Rwcm9jKHR3ZWV0cykKYGBgCgojIyMgQ29tcGFyYXRpdmUgYW5hbHlzZXMKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmlmIChleGlzdHMoJ2RmX2NvbXAnKSA9PSBGQUxTRSkgewogIGRmX2NvbXAgPC0gcmVhZF9jc3YoJ291dC9kZl9jb21wLmNzdicpCn0KYGBgCgoKIyMjIyBGaWx0ZXJpbmcKCiogc3BlY2lmaWMgbGVtbWFzCiAgKiBjb3dvcmsKICAqIHNub3dmbGFrZQoqIGRhdGEgYWZ0ZXIgMjAxOC0xMi0zMQoqIGZyZXF1ZW5jeSB0aHJlc2hob2xkCiogZWRnZXMgdGhyZXNoaG9sZAoKCiMjIENoZWNrIHR3ZWV0cwoKYGBge3J9CnR3ZWV0cyAlPiUKICBzZWxlY3QodHdlZXQsIGRhdGUpICU+JQogICMgc2xpY2UoLiwgc2FtcGxlKDE6bigpKSkgI3JhbmRvbSBzZWxlY3Rpb24KICBhcnJhbmdlKGRhdGUpCmBgYAoKCiMjIFVzYWdlIGludGVuc2l0eQoKYGBge3J9CnVzZXMgPC0gZ2V0X3VzZXModHdlZXRzKQp1c2VzX3RvdCA8LSBnZXRfdXNlc190b3QodXNlcykKYWdlID0gZ2V0X2FnZSh1c2VzKQpjb2VmX3ZhciA8LSBnZXRfY29lZl92YXIodXNlcykKbWVhbl9kYXRlIDwtIGdldF9tZWFuX2RhdGUodXNlcykKbWF4X2RhdGUgPC0gZ2V0X21heF9kYXRlKHVzZXMpCnVzZXNfbW9udGggPC0gY29udl91c2VzX21vbnRoKHVzZXMpCnVzZXNfcGx0IDwtIHBsdF91c2VzKHVzZXNfbW9udGgsIGxlbW1hLCBtZWFuX2RhdGUsIG1heF9kYXRlKQpnZ3Bsb3RseSh1c2VzX3BsdCkKYGBgCgoKIyMgRGVncmVlIGNlbnRyYWxpemF0aW9uCgojIyMgRGlhY2hyb25pYwoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAhPSAnZnVsbCcsCiAgICAjIExFTU1BID09ICdzb2xvcHJlbmV1cicKICAgIExFTU1BICVpbiUgYygKICAgICAgJ2dob3N0aW5nJywKICAgICAgJ2xpdHVhdGlvbicsCiAgICAgICdhbHQtbGVmdCcsCiAgICAgICdzb2xvcHJlbmV1cicKICAgICAgKQogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgQ0VOVF9ERUdSRUUpICU+JQogIG11dGF0ZShTVUJTRVQgPSBmYWN0b3IoU1VCU0VULCBsZXZlbHM9YygnZmlyc3QnLCAnbWVhbicsICdtYXgnLCAnbGFzdCcpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PVNVQlNFVCwgeT1DRU5UX0RFR1JFRSkpICsgIyBncm91cD0xCiAgICBnZW9tX3BvaW50KGFlcyhncm91cD1MRU1NQSwgY29sb3I9TEVNTUEsIHNoYXBlPUxFTU1BKSkgKwogICAgZ2VvbV9saW5lKGFlcyhncm91cD1MRU1NQSwgY29sb3I9TEVNTUEsIGxpbmV0eXBlPUxFTU1BKSkgKwogICAgZ3VpZGVzKGdyb3VwPUZBTFNFKSArCiAgICBnZ3RpdGxlKCdEaWZmdXNpb24gb3ZlciB0aW1lOiBjaGFuZ2VzIGluIGRlZ3JlZSBjZW50cmFsaXphdGlvbicpICsKICAgIHNjYWxlX3lfY29udGludW91cygnZGVncmVlIGNlbnRyYWxpdHkgKGxvZyknLCB0cmFucz0nbG9nJykgKwogICAgc2NhbGVfeF9kaXNjcmV0ZSgnc3Vic2V0JykKCnBsdAoKIyBnZ3NhdmUoJ291dC9jZW50X2RlZ19kaWFjX0FuZ2xvLVNheG9uLnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCgojIyMgT3ZlcmFsbAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgTEVNTUEgJWluJSBjYXNlcwogICAgIyBTVUJTRVQgPT0gJ2Z1bGwnCiAgICApICU+JQogIHNlbGVjdCgKICAgIExFTU1BLCAKICAgIEVER0VTLAogICAgQ0VOVF9ERUdSRUUsIAogICAgQ0VOVF9FVgogICAgKSAlPiUKICBhcnJhbmdlKGRlc2MoQ0VOVF9FVikpCmBgYAoKCiMgQ29tcGFyYXRpdmUgYW5hbHlzZXMKCgojIyBEZWdyZWUgY2VudHJhbGl0eQoKCiMjIyBPdmVyYWxsCgojIyMjIExpc3QKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTLCBDRU5UX0RFR1JFRSkgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJywKICAgICMgVVNFUyA+PSAxMDAwMAogICAgKSAlPiUKICBhcnJhbmdlKChDRU5UX0RFR1JFRSkpCmBgYAoKCiMjIyMgUGxvdAoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTLCBDRU5UX0RFR1JFRSkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIGFycmFuZ2UoKENFTlRfREVHUkVFKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PXJlb3JkZXIoTEVNTUEsIENFTlRfREVHUkVFKSkpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2Rpc2NyZXRlKCdsZW1tYXMnKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICAgICdkZWdyZWUgY2VudHJhbGl6YXRpb24gKGxvZyknLAogICAgICB0cmFucz0nbG9nJwogICAgICApCgpwbHQKCiMgZ2dzYXZlKCdvdXQvY2VudF9zeW5jX2FsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIE92ZXIgdGltZQoKIyMjIyBBY3Jvc3MgYWxsIGxlbW1hcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICVpbiUgKGMoCiAgICAgICdmaXJzdCcsIAogICAgICAnbGFzdCcKICAgICAgIyAnbWVhbicsCiAgICAgICMgJ21heCcKICAgICAgKSksCiAgICBFREdFUyA+PSA3MDAKICAgICkgJT4lCiAgZ3JvdXBfYnkoU1VCU0VUKSAlPiUKICBzdW1tYXJpemUoQ0VOVF9BVkcgPSBtZWFuKENFTlRfREVHUkVFKSkgJT4lCiAgbXV0YXRlKFNVQlNFVCA9IGZhY3RvcihTVUJTRVQsIGxldmVscz1jKAogICAgJ2ZpcnN0JywgCiAgICAnbGFzdCcKICAgICMgJ21lYW4nLAogICAgIyAnbWF4JwogICAgKSkpICU+JQogIGdncGxvdCguLCBhZXMoeD1TVUJTRVQsIHk9Q0VOVF9BVkcsIGdyb3VwPTEpKSArCiAgICBnZW9tX2NvbCgpCmBgYAoKCiMjIyMgQmlnZ2VzdCBjaGFuZ2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIEVER0VTKSAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgJWluJSBjKCdmaXJzdCcsICdsYXN0JyksCiAgICBFREdFUyA+PSAxMDAKICAgICkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KExFTU1BKSAlPiUKICBkcGx5cjo6bXV0YXRlKENFTlRfRElGRiA9IGxhZyhDRU5UX0RFR1JFRSkgLSBDRU5UX0RFR1JFRSkgJT4lCiAgZHJvcF9uYSgpICU+JQogIHNlbGVjdCgtU1VCU0VUKSAlPiUKICByZW5hbWUoCiAgICBDRU5UX0xBU1QgPSBDRU5UX0RFR1JFRSwKICAgIEVER0VTX0xBU1QgPSBFREdFUwogICAgKSAlPiUKICBhcnJhbmdlKGRlc2MoQ0VOVF9ESUZGKSkKYGBgCgoKIyBVc2FnZSBpbnRlbnNpdHkKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBhcnJhbmdlKGRlc2MoVVNFUykpCmBgYAoKCgojIFVzYWdlIGludGVuc2l0eSB2cy4gbmV0d29yayBjaGFyYWN0ZXJpc3RpY3MKCiMjIFVzZXMgdnMuIGRlZ3JlZSBjZW50cmFsaXphdGlvbgoKIyMjIFBsb3QKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZnVsbCcsCiAgICAjIFVTRVMgJWluJSAoMTAwMDA6MjAwMDAwMCksCiAgICBVU0VTICVpbiUgKDE1MDAwMDo1MDAwMDApLAogICAgIUxFTU1BICVpbiUgYygnc2x1dCBzaGFtaW5nJywgJ2Rhc2hjYW0nLCAnc2hhcmVhYmxlJywgJ2N1Y2tvbGQnLCAnZGVlcCBsZWFybmluZycsICdoeXBlcmxvY2FsJykKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBDRU5UX0RFR1JFRSwgVVNFUywgRURHRVMpICU+JQogIGdncGxvdCguLCBhZXMoeD1DRU5UX0RFR1JFRSwgeT1VU0VTKSkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MRU1NQSksIGhqdXN0PS0wLjEsIHZqdXN0PS0wLjEpICsgCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKAogICAgICAndXNhZ2UgZnJlcXVlbmN5IChsb2cpJywgCiAgICAgIHRyYW5zPSdsb2cnCiAgICAgICkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKAogICAgICAnZGVncmVlIGNlbnRyYWxpemF0aW9uJywKICAgICAgIyB0cmFucz0nbG9nJwogICAgICApICsKICAgIGdndGl0bGUoCiAgICAgICMgJ1VzYWdlIGZyZXF1ZW5jeSB2cy4gZGVncmVlIGNlbnRyYWxpemF0aW9uOiBmdWxsIHNhbXBsZScKICAgICAgJ1VzYWdlIGZyZXF1ZW5jeSB2cy4gZGVncmVlIGNlbnRyYWxpemF0aW9uOiB6b29taW5nIG9uIGNhc2Ugc3R1ZHkgbGV4ZW1lcycKICAgICAgKQogICAgIyBnZW9tX3Ntb290aChtZXRob2Q9bG0pCgpnZ3NhdmUoJ34vRGVza3RvcC9mcmVxLXZzLW5ldC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKICAgIApgYGAKCiMjIyBDb3JyZWxhdGlvbgoKYGBge3J9CmRmX2NvcnJfZnVsbCA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAhPSAnZnVsbCcsCiAgICBFREdFUyA+PSAxMDAKICAgICkgJT4lCiAgc2VsZWN0KC1jKExFTU1BLCBTVUJTRVQsIE5FVF9XSU5ET1dfREFURVMsIFNLSVAsIFNUQU1QLCBOUk9XUykpCiAgCmNvci50ZXN0KGRmX2NvcnJfZnVsbCRVU0VTLCBkZl9jb3JyX2Z1bGwkQ0VOVF9ERUdSRUUpCmBgYAoKCiMjIERlZ3JlZSBjZW50cmFsaXR5IHZzLiBjb21tdW5pdGllcwoKIyMjIENvcnJlbGF0aW9uCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdsYXN0JykgJT4lCiAgc2VsZWN0KENFTlRfREVHUkVFLCBDT01NVU5JVElFUykgJT4lCiAgbXV0YXRlKENPTU1VTklUSUVTID0gYXMubnVtZXJpYyhDT01NVU5JVElFUykpICU+JQogIGNvcnJlbGF0ZSgpCmBgYAoKCiMjIyBQbG90CgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdsYXN0JykgJT4lCiAgc2VsZWN0KExFTU1BLCBDRU5UX0RFR1JFRSwgQ09NTVVOSVRJRVMpICU+JQogIGdncGxvdCguLCBhZXMoeD1DRU5UX0RFR1JFRSwgeT1hcy5udW1lcmljKENPTU1VTklUSUVTKSkpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9TEVNTUEpKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnM9J2xvZycpCmBgYAoKCgojIyBVc2VzIHZzLiB1c2VycwoKIyMjIFBsb3QKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTLCBVU0VSUykgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PVVTRVJTLCB5PVVTRVMpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSdsb2cnKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZycpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSkKZ2dwbG90bHkocGx0KQpgYGAKCiMjIyBDb3JyZWxhdGlvbgoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIHNlbGVjdChVU0VTLCBVU0VSUykgJT4lCiAgY29ycmVsYXRlKCkKYGBgCgoKIyMgQ29lZmZpY2llbnQgb2YgdmFyaWF0aW9uCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgPT0gJ2Z1bGwnLAogICAgVVNFUyA+PSAxMDAwCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFUywgQ09FRl9WQVIpICU+JQogIGFycmFuZ2UoZGVzYyhDT0VGX1ZBUikpCmBgYAoKCiMjIFByb2Nlc3Npbmcgc3RhdHVzCgojIyMgTGVtbWEgbGlzdAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFNUQU1QKSAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdsYXN0JykgJT4lCiAgbXV0YXRlKFNUQU1QID0gYXNfZGF0ZXRpbWUoU1RBTVApKSAlPiUKICBhcnJhbmdlKGRlc2MoU1RBTVApKQpgYGAKCgojIyMgRGF0YXNldCBzdGF0aXN0aWNzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVMsIFVTRVJTKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKAogICAgVVNFU19UT1QgPSBzdW0oVVNFUyksCiAgICBVU0VSU19UT1QgPSBzdW0oVVNFUlMpCiAgICApCmBgYAoKCiMgQ09FRl9WQVIgdnMuIENFTlQKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIENPRUZfVkFSLCBDRU5UX0RFR1JFRSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh5PUNPRUZfVkFSLCB4PUNFTlRfREVHUkVFKSkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MRU1NQSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nJykKYGBgCgoKIyBDb3JyZWxhdGlvbnM6IEVEQQoKYGBge3J9CmxpYnJhcnkoSG1pc2MpCgpkZl9jb3JyIDwtIGRmX2NvbXAgJT4lCiAgIyBmaWx0ZXIoU1VCU0VUID09ICdsYXN0JykgJT4lCiAgc2VsZWN0KC1jKExFTU1BLCBTVUJTRVQsIE5FVF9XSU5ET1dfREFURVMsIFNLSVAsIFNUQU1QLCBOUk9XUykpCiAgIyBzZWxlY3QoLWMoVVNFUlMsIEFHRSkpICU+JQogICMgbXV0YXRlKEZPQ1VTID0gVVNFUykgJT4lCiAgIyBmb2N1cyhGT0NVUykgJT4lCiAgIyBnZ3Bsb3QoLiwgYWVzKHJlb3JkZXIocm93bmFtZSwgRk9DVVMpLCBGT0NVUykpICsKICAgICMgZ2VvbV9jb2woKSArCiAgICAjIGNvb3JkX2ZsaXAoKQogICMgcmVhcnJhbmdlKCkgJT4lCiAgIyBzaGF2ZSgpICU+JQogICMgcnBsb3QoKQogICMgbmV0d29ya19wbG90KG1pbl9jb3I9LjUpICU+JQoKICAKYGBgCgoKICA=